#include <fstream>
#include <ostream>
#include "../../source/server.hpp"

// 写进Buffer当中，如果文件过大的时候，因为中间进行了两次空间的创建，会很慢，
// 所以直接不使用buffer，直接使用string
//  static bool ReadFile(const std::string &filename, Buffer *buf)
//  {
//      std::ifstream ifs(filename, std::ios::binary); // 二进制打开方式
//      if (ifs.is_open() == false)
//      {
//          printf("open %s file failed!", filename.c_str());
//          return false;
//      }
//      // 获取文件长度
//      ifs.seekg(0, ifs.end);
//      size_t fsize = ifs.tellg();
//      ifs.seekg(0, ifs.beg);

//     std::string str;
//     str.resize(fsize);
//     ifs.read(&str[0], fsize);
//     if (ifs.good() == false)
//     {
//         printf("read %s file failed!", filename.c_str());
//         ifs.close();
//         return false;
//     }
//     buf->WriteStringAndPush(str);
//     return true;
// }

static bool ReadFile(const std::string &filename, std::string *buf)
{
    std::ifstream ifs(filename, std::ios::binary); // 二进制打开方式
    if (ifs.is_open() == false)
    {
        printf("open %s file failed!", filename.c_str());
        return false;
    }
    // 获取文件长度
    ifs.seekg(0, ifs.end);
    size_t fsize = ifs.tellg();
    ifs.seekg(0, ifs.beg);
    // 开辟文件大小的空间
    buf->resize(fsize);
    ifs.read(&(*buf)[0], fsize);
    if (ifs.good() == false)
    {
        printf("read %s file failed!", filename.c_str());
        ifs.close();
        return false;
    }
    ifs.close();
    return true;
}

static bool WriteFile(const std::string &filename, const std::string &buf)
{
    std::ofstream ofs(filename, std::ios::binary | std::ios::trunc);
    if (ofs.is_open() == false)
    {
        printf("open %s file failed!", filename.c_str());
        return false;
    }
    ofs.write(buf.c_str(), buf.size());
    if (ofs.good() == false)
    {
        printf("write %s file failed!", filename.c_str());
        ofs.close();
        return false;
    }
    ofs.close();
    return true;
}

int main()
{
    std::string buf;
    bool ret = ReadFile("./split.cc", &buf);
    if (ret == false)
        std::cout << "ret false" << std::endl;
    // std::cout << buf << std::endl;
    ret = WriteFile("./ttt.c", buf);
    if (ret == false)
        std::cout << "ret false" << std::endl;
    /* 使用 md5sum 对split.cc 和 ttt.c 进行判断是否完全一样*/
    return 0;
}